home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / execute.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  2.3 KB  |  69 lines

  1. /*
  2.                             E X E C U T E . C
  3. */
  4.  
  5. #include "iccomp.h"
  6.  
  7. /*
  8.         process: execute(mode, cmd, chead, ahead, ..., atail,     ctail)
  9.         argnr:            1     2    3     4           count - 1, count
  10.         argindex:         0     1    2     3      4    count - 2, count - 1
  11.                                                   ...
  12.                                                   count-3
  13.         at least required: 6 arguments
  14.  
  15. */
  16. ESTRUC_ *execute(arr)
  17.     ESTRUC_
  18.         *arr;
  19. {
  20.     register unsigned
  21.         count;
  22.     ESTRUC_
  23.         tmp,
  24.         *argp,                              /* pointer to args */
  25.         e;
  26.  
  27.     count = arr->type;                      /* get argument count */
  28.  
  29.     if (count < 6)                          /* to few arguments */
  30.     {
  31.         semantic(illegal_argcount, "execute");
  32.         return (arr);                       /* dummy  args return */
  33.     }
  34.  
  35.     argp = codestruc(arr, 0);               /* point to first arg */
  36.     e = *(argp + 2);                        /* cmd head info at e */
  37.     callrss(&e, f_cmd_head);                /* code for cmd_head at e */
  38.  
  39.     callrss(argp + 3, f_arg_head);          /* code for arg_head */
  40.     catcode(&e, argp + 3);                  /* code appended to e*/
  41.  
  42.     callrss(&argp[count - 2], f_arg_tail);  /* code for arg_tail */
  43.     catcode(&e, &argp[count - 2]);          /* code appended to e*/
  44.  
  45.     callrss(&argp[count - 1], f_cmd_tail);  /* code for cmd_tail */
  46.     catcode(&e, &argp[count - 1]);          /* code appended to e*/
  47.  
  48.                                             /* keep variable # of args */
  49.     memmove(argp + 2, argp + 4, (count - 2) * sizeof(ESTRUC_));
  50.     arr->type -= 4;                         /* remove 4 arguments */
  51.  
  52.     catcode(&e, specials(f_exec, arr));     /* catenate call-code */
  53.  
  54.     free(stringbuf);                        /* make sure empty string */
  55.     stringbuf = xstrdup(nullstring);        /* is pushed */
  56.  
  57.     tmp = stackframe(e_str | e_const);      /* empty string argument */
  58.  
  59.     etoc(&tmp);
  60.     catcode(&e, &tmp);                      /* empty string on the stack */
  61.  
  62.     gencode(&e, op_call_rss, f_cmd_tail);   /* used with cmd_tail..cmd_head */
  63.     gencode(&e, op_call_rss, f_arg_tail);
  64.     gencode(&e, op_call_rss, f_arg_head);
  65.     callrss(&e, f_cmd_head);
  66.  
  67.     return (&e);                            /* done */
  68. }
  69.